package com.qf.fmall2204.websocket;

import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

@Component  // 注意，要把这个类的对象放入IOC容器
@ServerEndpoint("/webSocket/{oid}")  //这个注解定义了一个webscoket接口 ，路径 /order/{oid}
public class OrderStatusWebSocket {

    // map结构用于保存已经建立好websocket连接
    // key ： 订单编号
    // value ： websocket的 Session 对象
    private static ConcurrentHashMap<String,Session> map = new ConcurrentHashMap<>();

    /**
     * 当浏览器建立websocket连接时，会调用如下方法
     * @param oid      路径参数，订单编号
     * @param session  websocket核心对象，代表服务器端与该浏览器连接的连接对象
     */
    @OnOpen
    public void onOpen(@PathParam("oid") String oid, Session session) throws IOException {

        // 当浏览器建立websocket连接时，把创建号的 session对象保存起来
        System.out.println(oid);
        map.put(oid,session);
        // 写一个消息给浏览器
//        session.getBasicRemote().sendText("from server: 666,"+oid);
    }

    /**
     * 当浏览器断开连接后，会调用如下方法
     * @param oid
     * @param session
     */
    @OnClose
    public void onClose(@PathParam("oid") String oid, Session session){
        System.out.println("断开连接了：oid="+oid);
        map.remove(oid);
    }

    /**
     * 当浏览器发送消息时，会调用如下方法
     * @param message 浏览器发送的消息内容
     * @param oid
     * @param session
     */
    @OnMessage
    public void onMessage(String message,@PathParam("oid") String oid, Session session) throws IOException {
        System.out.println(oid +":"+message);
        session.getBasicRemote().sendText("from server:"+message);
    }

    /**
     * 定义一个用于发送消息的方法，给调用方使用
     * @param orderId
     * @param msg
     */
    public static void sendMsg(String orderId,String msg) throws IOException {
        Session session = map.get(orderId);
        session.getBasicRemote().sendText(msg);
    }

}
